package view;

import control.KasseController;
import control.SalgsController;
import databasehandling.HandlerFactory;
import databasehandling.KasseHandler;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import static java.awt.print.Printable.NO_SUCH_PAGE;
import static java.awt.print.Printable.PAGE_EXISTS;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import javax.swing.JOptionPane;
import model.Kasse;
import model.Salg;
import utility.DateUtility;
import utility.PriceFormater;
import view.MainGUI;

public class KasseRapportPanel extends javax.swing.JPanel implements Printable {

    private static final int LINES_PER_PAGE = 60;
    private final Font standard;
    private final Font kategori;
    private final Font overskrift;
    private int lineCount;
    private int yCoord;
    private Kasse valgtKasse;
    private final KasseHandler kasseHandler;
    private final int X_NAVN = 10;
    private final int X_STYK = 220;
    private final int X_TOTAL = 490;
    private static final Color EUR_COLOR = new Color(240, 240, 240);

    private boolean settingCombos;

    /**
     * opretter nyt KasseRapportPanel
     *
     * @param mainGUI
     */
    public KasseRapportPanel(MainGUI mainGUI) {
        initComponents();
        kasseHandler = HandlerFactory.getInstance().getKasseHandler();

        standard = new Font("Tahoma", 0, 11);
        kategori = new Font("Tahoma", 1, 11);
        overskrift = new Font("Meiryo", 0, 20);
        lineCount = 0;
        yCoord = 0;
        settingCombos = false;
        setCombos();
    }

    private void setCombos() {
        settingCombos = true;
        //<editor-fold defaultstate="collapsed" desc="SetCombos">
        for (int i = 0; i < 31; i++) {
            datoCombo.addItem(i + 1);
        }
        for (int i = 0; i < DateUtility.hentMåneder().length; i++) {
            månedCombo.addItem(DateUtility.hentMåneder()[i]);
        }
        for (int i = 0; i < DateUtility.hentÅr().length; i++) {
            årCombo.addItem(DateUtility.hentÅr()[i]);
        }
        SimpleDateFormat sdf = new SimpleDateFormat("dd");
        Calendar cal = Calendar.getInstance();
        datoCombo.setSelectedIndex(Integer.parseInt(sdf.format(cal.getTime())) - 1);
        sdf = new SimpleDateFormat("MM");
        månedCombo.setSelectedIndex(Integer.parseInt(sdf.format(cal.getTime())) - 1);

//</editor-fold>
        settingCombos = false;
    }

    /**
     *
     */
    private void setValgtKasse() {
        String dateString = "";
        dateString = dateString + (datoCombo.getSelectedIndex() + 1) + ".";
        dateString = dateString + (månedCombo.getSelectedIndex() + 1) + ".";
        dateString = dateString + årCombo.getSelectedItem();
        try {
            statusLabel.setText("");
            SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
            Calendar cal = Calendar.getInstance();
            cal.setTime(sdf.parse(dateString));
            valgtKasse = kasseHandler.getKasseVedDato(cal);

            if (valgtKasse != null) {
                if (!valgtKasse.isKasseLukket()) {
                    valgtKasse = null;
                    statusLabel.setText("Den valgte kasse er ikke lukket endnu.");
                } else {
                    antalSalgLabel.setText(kasseHandler.hentAlleSalgVedKasse(valgtKasse).size() + "");
                    jPanel1.repaint(); //Tegner KasseRapporten på Panelet
                    statusLabel.setText("");
                }
            } else {
                statusLabel.setText("Der er endnu ikke oprettet en kasse på den valgte dato");
            }
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(this, "Fejl 1001 \nFejl ved indlæsning af kasse fra databasen. Prøv venligst igen senere. \n" + ex.getLocalizedMessage(), "Database Timeout", 0);
        } catch (ParseException ex) {
            JOptionPane.showMessageDialog(this, "Fejl 1025 \nFejl ved formatering af dato. \n" + ex.getLocalizedMessage(), "Fejl", 0);
        }
    }

    private int calcStringLenght(Graphics g, String str) {
        FontMetrics fm = g.getFontMetrics();
        return fm.stringWidth(str);
    }

    //<editor-fold defaultstate="collapsed" desc="Tegn KasseRapport-Metoder">
    private void tegnKasseRapport(Graphics g) {
        yCoord = 40;
        lineCount = 0;
        tilføjSignatur(g);
        tilføjVarelinje(g);
        tilføjBilletLinje(g);
        tilføjEventLinje(g);
        tilføjSlutLinjer(g);
    }

    private void tilføjSignatur(Graphics g) {
        SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
        g.setFont(overskrift);
        g.drawString("MuseumSyd", 230, yCoord);
        g.setFont(kategori);
        yCoord = yCoord + 40;
        g.drawString("KasseRapport for " + sdf.format(valgtKasse.getDato().getTime()), 195, yCoord);
        yCoord = yCoord + 20;
        g.drawLine(10, yCoord, 550, yCoord);
        yCoord = yCoord + 20;
        lineCount = lineCount + 4;
    }

    private void tilføjVarelinje(Graphics g) {
        try {
            ArrayList<Salg> salgsListe = kasseHandler.hentAlleSalgVedKasse(valgtKasse);
            int totalPrisDKK = 0;
            int totalPrisEUR = 0;
            for (int i = 0; i < salgsListe.size(); i++) {
                if (salgsListe.get(i).isValutaDKK()) {
                    totalPrisDKK = totalPrisDKK + SalgsController.beregnTotalBeløbPåVareSalgsListe(salgsListe.get(i).getVareSalgsListe());
                } else {
                    totalPrisEUR = totalPrisEUR + SalgsController.beregnTotalBeløbPåVareSalgsListe(salgsListe.get(i).getVareSalgsListe());
                }
            }
            //<editor-fold defaultstate="collapsed" desc="Drawing">
            if (!salgsListe.isEmpty()) {
                g.setFont(standard);
                g.drawString("Varer DKK", X_NAVN, yCoord);
                g.drawString(PriceFormater.formaterPrisTilString(totalPrisDKK) + " DKK", 550 - calcStringLenght(g, PriceFormater.formaterPrisTilString(totalPrisDKK) + " DKK"), yCoord);
                yCoord = yCoord + 20;
                g.setColor(EUR_COLOR);
                g.fillRect(5, yCoord - 15, 549, 20);
                g.setColor(Color.black);
                g.drawString("Varer EUR", X_NAVN, yCoord);
                g.drawString(PriceFormater.formaterPrisTilString(totalPrisEUR) + " EUR", 550 - calcStringLenght(g, PriceFormater.formaterPrisTilString(totalPrisEUR) + " EUR"), yCoord);
                yCoord = yCoord + 20;
                lineCount = lineCount + 2;
            }
//</editor-fold>
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(this, "Fejl 1002 \nFejl ved indlæsning af salg fra databasen. Prøv venligst igen senere \n" + ex.getLocalizedMessage(), "Database Timeout", 0);
        } catch (ParseException ex) {
            JOptionPane.showMessageDialog(this, "Fejl 1025 \nFejl ved formatering af dato \n" + ex.getLocalizedMessage(), "Fejl", 0);
        }
    }

    private void tilføjBilletLinje(Graphics g) {
        try {
            ArrayList<Salg> salgsListe = kasseHandler.hentAlleSalgVedKasse(valgtKasse);
            int totalPrisDKK = 0;
            int totalPrisEUR = 0;
            for (int i = 0; i < salgsListe.size(); i++) {
                if (salgsListe.get(i).isValutaDKK()) {
                    totalPrisDKK = totalPrisDKK + SalgsController.beregnTotalBeløbPåBilletSalgsListe(HandlerFactory.getInstance().getSalgsHandler().hentBilletTilknyttetSalg(salgsListe.get(i)));
                } else {
                    totalPrisEUR = totalPrisEUR + SalgsController.beregnTotalBeløbPåBilletSalgsListe(HandlerFactory.getInstance().getSalgsHandler().hentBilletTilknyttetSalg(salgsListe.get(i)));
                }
            }
            if (!salgsListe.isEmpty()) {
                g.setFont(standard);
                g.drawString("Billetter DKK", X_NAVN, yCoord);
                g.drawString(PriceFormater.formaterPrisTilString(totalPrisDKK) + " DKK", 550 - calcStringLenght(g, PriceFormater.formaterPrisTilString(totalPrisDKK) + " DKK"), yCoord);
                yCoord = yCoord + 20;
                g.setColor(EUR_COLOR);
                g.fillRect(5, yCoord - 15, 549, 20);
                g.setColor(Color.black);
                g.drawString("Billetter EUR", X_NAVN, yCoord);
                g.drawString(PriceFormater.formaterPrisTilString(totalPrisEUR) + " EUR", 550 - calcStringLenght(g, PriceFormater.formaterPrisTilString(totalPrisEUR) + " EUR"), yCoord);
                yCoord = yCoord + 20;
                lineCount = lineCount + 2;
            }
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(this, "Fejl 1002 \nFejl ved indlæsning af salg fra databasen. Prøv venligst igen senere \n" + ex.getLocalizedMessage(), "Database Timeout", 0);
        } catch (ParseException ex) {
            JOptionPane.showMessageDialog(this, "Fejl 1025 \nFejl ved formatering af dato \n" + ex.getLocalizedMessage(), "Fejl", 0);
        }
    }

    private void tilføjEventLinje(Graphics g) {
        try {
            ArrayList<Salg> salgsListe = kasseHandler.hentAlleSalgVedKasse(valgtKasse);
            int totalPrisDKK = 0;
            int totalPrisEUR = 0;
            for (int i = 0; i < salgsListe.size(); i++) {
                if (salgsListe.get(i).isValutaDKK()) {
                    totalPrisDKK = totalPrisDKK + SalgsController.beregnTotalBeløbPåEventSalgsListe(HandlerFactory.getInstance().getSalgsHandler().hentEventsTilknyttetSalg(salgsListe.get(i)));
                } else {
                    totalPrisEUR = totalPrisEUR + SalgsController.beregnTotalBeløbPåEventSalgsListe(HandlerFactory.getInstance().getSalgsHandler().hentEventsTilknyttetSalg(salgsListe.get(i)));
                }
            }
            if (!salgsListe.isEmpty()) {
                g.setFont(standard);
                g.drawString("Events DKK", X_NAVN, yCoord);
                g.drawString(PriceFormater.formaterPrisTilString(totalPrisDKK) + " DKK", 550 - calcStringLenght(g, PriceFormater.formaterPrisTilString(totalPrisDKK) + " DKK"), yCoord);
                yCoord = yCoord + 20;
                g.setColor(EUR_COLOR);
                g.fillRect(5, yCoord - 15, 549, 20);
                g.setColor(Color.black);
                g.drawString("Events EUR", X_NAVN, yCoord);
                g.drawString(PriceFormater.formaterPrisTilString(totalPrisEUR) + " EUR", 550 - calcStringLenght(g, PriceFormater.formaterPrisTilString(totalPrisEUR) + " EUR"), yCoord);
                yCoord = yCoord + 20;
                lineCount = lineCount + 2;
            }
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(this, "Fejl 1002 \nFejl ved indlæsning af salg fra databasen. Prøv venligst igen senere \n" + ex.getLocalizedMessage(), "Database Timeout", 0);
        } catch (ParseException ex) {
            JOptionPane.showMessageDialog(this, "Fejl 1025 \nFejl ved formatering af dato \n" + ex.getLocalizedMessage(), "Fejl", 0);
        }
    }

    private void tilføjSlutLinjer(Graphics g) {
        try {
            g.drawLine(10, yCoord, 550, yCoord);
            yCoord = yCoord + 20;
            g.setFont(kategori);
            g.drawString("TotalSalg DKK: ", X_NAVN, yCoord);
            yCoord = yCoord + 20;
            g.setFont(standard);
            g.drawString("Kontant: ", X_NAVN, yCoord);
            g.drawString(PriceFormater.formaterPrisTilString(KasseController.getInstance().totalSalgDKKVedKasse(valgtKasse, false)) + " DKK", 550 - calcStringLenght(g, PriceFormater.formaterPrisTilString(KasseController.getInstance().totalSalgDKKVedKasse(valgtKasse, false)) + " DKK"), yCoord);
            yCoord = yCoord + 20;
            g.drawString("Dankort: ", X_NAVN, yCoord);
            g.drawString(PriceFormater.formaterPrisTilString(KasseController.getInstance().totalSalgDKKVedKasse(valgtKasse, true)) + " DKK", 550 - calcStringLenght(g, PriceFormater.formaterPrisTilString(KasseController.getInstance().totalSalgDKKVedKasse(valgtKasse, true)) + " DKK"), yCoord);
            yCoord = yCoord + 20;
            g.setFont(kategori);
            g.drawString("TotalSalg EUR", X_NAVN, yCoord);
            yCoord = yCoord + 20;
            g.setFont(standard);
            g.drawString("Kontant: ", X_NAVN, yCoord);
            g.drawString(PriceFormater.formaterPrisTilString(KasseController.getInstance().totalSalgEUROVedKasse(valgtKasse, false)) + " EUR", 550 - calcStringLenght(g, PriceFormater.formaterPrisTilString(KasseController.getInstance().totalSalgEUROVedKasse(valgtKasse, false)) + " EUR"), yCoord);
            yCoord = yCoord + 20;
            g.drawString("Dankort: ", X_NAVN, yCoord);
            g.drawString(PriceFormater.formaterPrisTilString(KasseController.getInstance().totalSalgEUROVedKasse(valgtKasse, true)) + " EUR", 550 - calcStringLenght(g, PriceFormater.formaterPrisTilString(KasseController.getInstance().totalSalgEUROVedKasse(valgtKasse, true)) + " EUR"), yCoord);
            yCoord = yCoord + 20;
            g.setFont(kategori);
            g.drawString("Slutbeholdning i kasse: ", X_NAVN, yCoord);
            yCoord = yCoord + 20;
            g.setFont(standard);
            g.drawString("DKK optalt ", X_NAVN, yCoord);
            g.drawString(PriceFormater.formaterPrisTilString(valgtKasse.getSlutBeholdningDKK()) + " DKK", 550 - calcStringLenght(g, PriceFormater.formaterPrisTilString(valgtKasse.getSlutBeholdningDKK()) + " DKK"), yCoord);
            yCoord = yCoord + 20;
            g.drawString("DKK beregnet ", X_NAVN, yCoord);
            g.drawString("Startbeholdning " + PriceFormater.formaterPrisTilString(valgtKasse.getStartBeholdningDKK()) + " + Totalsalg " + PriceFormater.formaterPrisTilString(KasseController.getInstance().totalSalgDKKVedKasse(valgtKasse, false)) + " = ", X_STYK, yCoord);
            g.drawString(PriceFormater.formaterPrisTilString(valgtKasse.getStartBeholdningDKK() + (KasseController.getInstance().totalSalgDKKVedKasse(valgtKasse, false))) + " DKK", 550 - calcStringLenght(g, PriceFormater.formaterPrisTilString(valgtKasse.getStartBeholdningDKK() + (KasseController.getInstance().totalSalgDKKVedKasse(valgtKasse, false))) + " DKK"), yCoord);
            yCoord = yCoord + 5;
            g.drawLine(10, yCoord, 550, yCoord);
            yCoord = yCoord + 20;
            g.drawString("Difference", X_NAVN, yCoord);
            g.drawString(PriceFormater.formaterPrisTilString(valgtKasse.getSlutBeholdningDKK() - (valgtKasse.getStartBeholdningDKK() + (KasseController.getInstance().totalSalgDKKVedKasse(valgtKasse, false)))) + " DKK", 550 - calcStringLenght(g, PriceFormater.formaterPrisTilString(valgtKasse.getSlutBeholdningDKK() - (valgtKasse.getStartBeholdningDKK() + (KasseController.getInstance().totalSalgDKKVedKasse(valgtKasse, false)))) + " DKK"), yCoord);
            yCoord = yCoord + 5;
            g.drawLine(10, yCoord, 550, yCoord);
            yCoord = yCoord + 2;
            g.drawLine(10, yCoord, 550, yCoord);
            yCoord = yCoord + 30;
            g.drawString("EURO optalt", X_NAVN, yCoord);
            g.drawString(PriceFormater.formaterPrisTilString(valgtKasse.getSlutBeholdningEURO()) + " EUR", 550 - calcStringLenght(g, PriceFormater.formaterPrisTilString(valgtKasse.getSlutBeholdningEURO()) + " EUR"), yCoord);
            yCoord = yCoord + 20;
            g.drawString("EURO beregnet", X_NAVN, yCoord);
            g.drawString("Startbeholdning " + PriceFormater.formaterPrisTilString(valgtKasse.getStartBeholdningEURO()) + " + Totalsalg " + PriceFormater.formaterPrisTilString(KasseController.getInstance().totalSalgEUROVedKasse(valgtKasse, false)) + " = ", X_STYK, yCoord);
            g.drawString(PriceFormater.formaterPrisTilString(valgtKasse.getStartBeholdningEURO() + (KasseController.getInstance().totalSalgEUROVedKasse(valgtKasse, false))) + " EUR", 550 - calcStringLenght(g, PriceFormater.formaterPrisTilString(valgtKasse.getStartBeholdningEURO() + (KasseController.getInstance().totalSalgEUROVedKasse(valgtKasse, false))) + " EUR"), yCoord);
            yCoord = yCoord + 5;
            g.drawLine(10, yCoord, 550, yCoord);
            yCoord = yCoord + 20;
            g.drawString("Difference", X_NAVN, yCoord);
            g.drawString(PriceFormater.formaterPrisTilString(valgtKasse.getSlutBeholdningEURO() - (valgtKasse.getStartBeholdningEURO() + (KasseController.getInstance().totalSalgEUROVedKasse(valgtKasse, false)))) + " EUR", 550 - calcStringLenght(g, PriceFormater.formaterPrisTilString(valgtKasse.getSlutBeholdningEURO() - (valgtKasse.getStartBeholdningEURO() + (KasseController.getInstance().totalSalgEUROVedKasse(valgtKasse, false)))) + " EUR"), yCoord);
            yCoord = yCoord + 5;
            g.drawLine(10, yCoord, 550, yCoord);
            yCoord = yCoord + 2;
            g.drawLine(10, yCoord, 550, yCoord);
            yCoord = yCoord + 20;
            lineCount = lineCount + 14;
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(this, "Fejl 1001 \nFejl ved indlæsning af salg fra databasen. Prøv venligst igen senere. \n" + ex.getLocalizedMessage(), "Database Timeout", 0);
        } catch (ParseException ex) {
            JOptionPane.showMessageDialog(this, "Fejl 1025 \nFejl ved formatering af dato. \n" + ex.getLocalizedMessage(), "Fejl", 0);
        }
    }
//</editor-fold>

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        datoLbl = new javax.swing.JLabel();
        månedLbl = new javax.swing.JLabel();
        årLbl = new javax.swing.JLabel();
        udskrivKnap = new javax.swing.JButton();
        jPanel1 = new javax.swing.JPanel(){
            public void paint(Graphics g){
                super.paint(g);
                super.paintComponent(g);
                if(valgtKasse != null){
                    tegnKasseRapport(g);
                }else{
                    g.clearRect(0, 0, g.getClipBounds().width, g.getClipBounds().height);
                }

            }
        };
        datoCombo = new javax.swing.JComboBox();
        månedCombo = new javax.swing.JComboBox();
        årCombo = new javax.swing.JComboBox();
        jPanel2 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        antalSalgLabel = new javax.swing.JLabel();
        statusLabel = new javax.swing.JLabel();

        setOpaque(false);
        addComponentListener(new java.awt.event.ComponentAdapter() {
            public void componentShown(java.awt.event.ComponentEvent evt) {
                formComponentShown(evt);
            }
        });
        setLayout(null);

        datoLbl.setText("Dato:");
        add(datoLbl);
        datoLbl.setBounds(590, 20, 36, 23);

        månedLbl.setText("Måned: ");
        add(månedLbl);
        månedLbl.setBounds(590, 60, 50, 20);

        årLbl.setText("År:");
        add(årLbl);
        årLbl.setBounds(590, 100, 24, 20);

        udskrivKnap.setText("Udskriv");
        udskrivKnap.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                udskrivKnapActionPerformed(evt);
            }
        });
        add(udskrivKnap);
        udskrivKnap.setBounds(610, 550, 158, 45);

        jPanel1.setBackground(new java.awt.Color(255, 255, 255));
        jPanel1.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0), 2));
        jPanel1.setOpaque(false);

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 556, Short.MAX_VALUE)
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );

        add(jPanel1);
        jPanel1.setBounds(10, 11, 560, 540);

        datoCombo.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                datoComboItemStateChanged(evt);
            }
        });
        add(datoCombo);
        datoCombo.setBounds(670, 20, 80, 20);

        månedCombo.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                månedComboItemStateChanged(evt);
            }
        });
        add(månedCombo);
        månedCombo.setBounds(670, 60, 80, 20);

        årCombo.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                årComboItemStateChanged(evt);
            }
        });
        add(årCombo);
        årCombo.setBounds(670, 100, 80, 20);

        jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder("Info om den fundne salgsdag"));
        jPanel2.setOpaque(false);

        jLabel1.setText("Salg lavet i den valgte Kasse:");

        antalSalgLabel.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
        antalSalgLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);

        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
        jPanel2.setLayout(jPanel2Layout);
        jPanel2Layout.setHorizontalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addComponent(jLabel1)
                .addGap(0, 37, Short.MAX_VALUE))
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addGap(41, 41, 41)
                .addComponent(antalSalgLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 68, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        jPanel2Layout.setVerticalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(antalSalgLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(86, Short.MAX_VALUE))
        );

        add(jPanel2);
        jPanel2.setBounds(590, 180, 190, 180);

        statusLabel.setForeground(new java.awt.Color(255, 0, 51));
        add(statusLabel);
        statusLabel.setBounds(10, 570, 560, 20);
    }// </editor-fold>//GEN-END:initComponents

    private void udskrivKnapActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_udskrivKnapActionPerformed
        PrinterJob job = PrinterJob.getPrinterJob();
        Printable doc = this;
        job.setPrintable(doc);
        boolean accept = job.printDialog();
        if (accept) {
            try {
                job.print();
            } catch (PrinterException ex) {
                JOptionPane.showMessageDialog(this, "Fejl 1100 \nDer er sket en fejl i forbindelse med udskrivning. \n" + ex.getLocalizedMessage(), "PrinterFejl", 0);
            }
        }
    }//GEN-LAST:event_udskrivKnapActionPerformed

    private void formComponentShown(java.awt.event.ComponentEvent evt) {//GEN-FIRST:event_formComponentShown
        if (!settingCombos) {
            setValgtKasse();
        }
    }//GEN-LAST:event_formComponentShown

    private void datoComboItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_datoComboItemStateChanged
        if (!settingCombos) {
            setValgtKasse();
            jPanel1.repaint();
        }
    }//GEN-LAST:event_datoComboItemStateChanged

    private void månedComboItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_månedComboItemStateChanged
        if (!settingCombos) {
            setValgtKasse();
            jPanel1.repaint();
        }
    }//GEN-LAST:event_månedComboItemStateChanged

    private void årComboItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_årComboItemStateChanged
        if (!settingCombos) {
            setValgtKasse();
            jPanel1.repaint();
        }
    }//GEN-LAST:event_årComboItemStateChanged


    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JLabel antalSalgLabel;
    private javax.swing.JComboBox datoCombo;
    private javax.swing.JLabel datoLbl;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JComboBox månedCombo;
    private javax.swing.JLabel månedLbl;
    private javax.swing.JLabel statusLabel;
    private javax.swing.JButton udskrivKnap;
    private javax.swing.JComboBox årCombo;
    private javax.swing.JLabel årLbl;
    // End of variables declaration//GEN-END:variables

    @Override
    public int print(Graphics g, PageFormat pf, int page) throws PrinterException {
        int printResult;
        if (page > lineCount / LINES_PER_PAGE) {
            printResult = NO_SUCH_PAGE;
        } else {
            // Find øverste venstre hjørne i det printbare område
            // Forskyd g2d, så (0,0) svarer til øverste venstre hjørne
            Graphics2D g2d = (Graphics2D) g;
            double x0 = pf.getImageableX();
            double y0 = pf.getImageableY();
            g2d.translate(x0, y0);
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            tegnKasseRapport(g2d);
            printResult = PAGE_EXISTS;
        }
        return printResult;
    }
}
